package org.example;

import java.util.ArrayList;

/**
 *shk解释:
 * flag为true，while循环会非常频繁的判断if条件，一开始list.size()是0，if条件不满足，
 * myThread1线程就会缓存list.size()的结果，不会每次都真实的访问list集合真正的size变量主存。
 * main线程修改了size变量值后，本来要同步myThread1线程缓存的size值，但是因为while循环频繁读取缓存值，
 * 导致没有机会修改'这个缓存值。但是要是加了打印语句就不一样了，相当于有空隙时间给缓存与主存值同步。
 *
 */

@SuppressWarnings("all")
public class Demo {
    private static ArrayList<String> list = new ArrayList();

    public static void main(String[] args) throws Exception {
        new Thread(new Runnable() {
            boolean flag = true;
            String latestEle = null;

            public void run() {
                System.out.println("myThread1中的run方法开始执行了");

                while (flag) {
/**
    一.如果主线程"执行"Thread.sleep(8L);
        1.如果"注释"下面的System.out.println("进入while循环了");,则myThread1线程"会卡住",System.out.println("进入if了");不会被执行
        2.如果"不注释"下面的System.out.println("进入while循环了");,则myThread1线程"不会卡住",System.out.println("进入if了");会被执行
    二.如果主线程"不执行"Thread.sleep(8L);
        下面的System.out.println("进入while循环了"); 执行不执行都无关紧要
 */
//                    System.out.println("进入while循环了");

                    if (list.size() != 0) { //主要是线程会缓存list.size()的值
                        System.out.println("进入if了");
                        latestEle =list.get(list.size() - 1);
                        try {
                            Thread.sleep(1000L);
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }

                        System.out.println("获取最后添加的元素是:" + this.latestEle);
                        System.out.println();
                    }
//                    System.out.println("while循环结束了");
                }

            }
        },"myThread1").start();

        Thread.sleep(100);//保证myThread1线程先启动,myThread1线程中会首先缓存list.size()=0的值.
        list.add("aa");
        list.add("bb");
        System.out.println("主线程执行完成-----打印list:" + list);
    }
}